package com.weijian.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.weijian.common.result.ApiResponse;
import com.weijian.dal.entity.Task;
import com.weijian.dal.enums.TaskStatus;
import com.weijian.mapper.TaskMapper;
import com.weijian.service.TaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 任务服务实现类
 */
@Service
public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements TaskService {

    // 存储任务ID与SSE连接的映射
    private final Map<String, SseEmitter> taskEmitters = new ConcurrentHashMap<>();

    @Override
    public String createTask() {
        Task task = new Task();
        task.setTaskNo(UUID.randomUUID().toString());
        task.setStatus(TaskStatus.PENDING);
        this.save(task);
        return task.getTaskNo();
    }

    /**
     * 创建新任务并关联指定dataId的数据
     * 
     * 主要完成以下几件事：
     * 1. 创建一个新的任务实体，设置任务编号和初始状态
     * 2. 设置任务关联的数据ID
     * 3. 返回任务编号，用于后续任务状态跟踪
     * 
     * @param dataId 数据ID，用于关联之前上传的数据
     * @return 任务编号
     */
    @Override
    public String createTask(Integer dataId) {
        Task task = new Task();
        task.setTaskNo(UUID.randomUUID().toString());
        task.setStatus(TaskStatus.PENDING);
        task.setDataId(dataId);
        this.save(task);
        return task.getTaskNo();
    }

    @Override
    public void updateTaskStatus(String taskId, TaskStatus status) {
        Task task = lambdaQuery().eq(Task::getTaskNo, taskId).one();
        if (task != null) {
            task.setStatus(status);
            this.updateById(task);
        }
    }

    @Override
    public void updateTaskStatus(String taskId, TaskStatus status, String message) {
        Task task = lambdaQuery().eq(Task::getTaskNo, taskId).one();
        if (task != null) {
            task.setStatus(status);
            this.updateById(task);
        }
    }
    
    @Override
    public List<Task> getTasksByDataId(Integer dataId) {
        return this.lambdaQuery()
                .eq(Task::getDataId, dataId)
                .list();
    }
    
    /**
     * 注册任务的SSE连接
     *
     * @param taskId 任务号
     * @return SseEmitter
     */
    @Override
    public SseEmitter registerTask(String taskId) {
        SseEmitter emitter = new SseEmitter(Long.MAX_VALUE);

        // 添加完成和超时回调
        emitter.onCompletion(() -> taskEmitters.remove(taskId));
        emitter.onTimeout(() -> taskEmitters.remove(taskId));

        taskEmitters.put(taskId, emitter);
        return emitter;
    }

    /**
     * 向客户端发送任务状态更新
     *
     * @param taskId 任务号
     * @param result 任务执行结果
     */
    @Override
    public void sendTaskStatus(String taskId, ApiResponse<String> result) {
        SseEmitter emitter = taskEmitters.get(taskId);
        if (emitter != null) {
            try {
                emitter.send(SseEmitter.event().name("taskStatus").data(result));
                emitter.complete();
            } catch (Exception e) {
                taskEmitters.remove(taskId);
            }
        }
    }

    /**
     * 根据任务编号获取任务信息
     *
     * @param taskNo 任务编号
     * @return 任务信息
     */
    @Override
    public Task getByTaskNo(String taskNo) {
        return this.lambdaQuery()
                .eq(Task::getTaskNo, taskNo)
                .one();
    }
}